/* 
 * Autores:
 *      Jonathan Lopez  11106
 *      Jorge Martínez  11237
 * 
 * Ultima revision: $Rev: 29 $
 *      Fecha: $Date: 2011-11-13 08:40:16 +0000 (Sun, 13 Nov 2011) $
 * 
 * Archivo: PanelServicios.java
 */

package GUI;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import Servicios.*;
import java.awt.event.ActionListener;
import java.util.ArrayList;

/**
 * Panel que contiene el listado de servicios de una categoria en particular.
 * 
 * @author Jorge
 * @author Jonathan
 */
public class PanelServicios extends javax.swing.JPanel {
    private final JPanel panelAnterior;
    private final String nombreCategoria;
    private final Usuario usuarioActual;
    
    private iEnlace enlaceActual = null;
    private int seleccionActual = -1;
    private JPanel pnlCampos = new JPanel();
    private JPanel pnlRelleno = new JPanel();
    
    private ArrayList<String> serviciosDisponibles = new ArrayList<String>();
    
    private ArrayList<String> campos = new ArrayList<String>();
    private ArrayList<String> valores = new ArrayList<String>();
    
    /** Creates new form PanelServicios */
    public PanelServicios( String nombreCategoria, Usuario usuarioActual ) {
        this.nombreCategoria = nombreCategoria;
        this.usuarioActual = usuarioActual;
        
        initComponents();
        
        panelAnterior = FramePrincipal.cambiarPanel( this );
        lblCategoria.setText("Categoria: " + nombreCategoria);
        lblNombre.setText( usuarioActual.obtenerUsuario() );
        
        // Obtener los servicios de la categoria
        String[] servicios = FramePrincipal.
                obtenerServicios().obtenerNombreServicios(nombreCategoria);
        for (String servicioActual : servicios) {
            cboxServicios.addItem( servicioActual );
            serviciosDisponibles.add(servicioActual);
        }
        
        // Crear el panel de relleno
        pnlRelleno.setLayout( new BoxLayout( pnlRelleno, BoxLayout.PAGE_AXIS) );
        pnlRelleno.add( pnlCampos );
        Dimension dim = pnlListaCampos.getSize();
        dim.width = 0;
        pnlRelleno.add( Box.createRigidArea( dim ));
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lblUsuario = new javax.swing.JLabel();
        lblNombre = new javax.swing.JLabel();
        lblCategoria = new javax.swing.JLabel();
        lblEscoger = new javax.swing.JLabel();
        cboxServicios = new javax.swing.JComboBox();
        btnAgregarServicio = new javax.swing.JButton();
        btnEliminarServicio = new javax.swing.JButton();
        pnlListaCampos = new javax.swing.JScrollPane();
        btnSubir = new javax.swing.JButton();
        btnBajar = new javax.swing.JButton();
        btnAgregarCampo = new javax.swing.JButton();
        btnEliminarCampo = new javax.swing.JButton();
        lblRegresar = new javax.swing.JLabel();
        chkEditar = new javax.swing.JCheckBox();

        lblUsuario.setFont(new java.awt.Font("Ubuntu", 1, 15));
        lblUsuario.setText("Usuario:");

        lblNombre.setText("<usuario>");

        lblCategoria.setText("<Nombre categoria>");

        lblEscoger.setText("Escoja el servicio que desea consultar.");

        cboxServicios.setModel(new DefaultComboBoxModel());
        cboxServicios.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cboxServiciosActionPerformed(evt);
            }
        });

        btnAgregarServicio.setText("Agregar servicio");
        btnAgregarServicio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAgregarServicioActionPerformed(evt);
            }
        });

        btnEliminarServicio.setText("Eliminar servicio");
        btnEliminarServicio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarServicioActionPerformed(evt);
            }
        });

        pnlListaCampos.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        btnSubir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/FlechaArriba.png"))); // NOI18N
        btnSubir.setEnabled(false);
        btnSubir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSubirActionPerformed(evt);
            }
        });

        btnBajar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/FlechaAbajo.png"))); // NOI18N
        btnBajar.setEnabled(false);
        btnBajar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBajarActionPerformed(evt);
            }
        });

        btnAgregarCampo.setText("Agregar campo");
        btnAgregarCampo.setEnabled(false);
        btnAgregarCampo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAgregarCampoActionPerformed(evt);
            }
        });

        btnEliminarCampo.setText("Eliminar campo");
        btnEliminarCampo.setEnabled(false);
        btnEliminarCampo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarCampoActionPerformed(evt);
            }
        });

        lblRegresar.setForeground(java.awt.SystemColor.activeCaption);
        lblRegresar.setText("Regresar a categorias");
        lblRegresar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lblRegresarMouseClicked(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                lblRegresarMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                lblRegresarMouseExited(evt);
            }
        });

        chkEditar.setText("Editar");
        chkEditar.setEnabled(false);
        chkEditar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chkEditarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(cboxServicios, 0, 374, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblUsuario)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblNombre))
                    .addComponent(lblCategoria)
                    .addComponent(lblEscoger)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnAgregarServicio)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 129, Short.MAX_VALUE)
                        .addComponent(btnEliminarServicio))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                .addComponent(btnAgregarCampo)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btnEliminarCampo))
                            .addComponent(pnlListaCampos, javax.swing.GroupLayout.DEFAULT_SIZE, 324, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(btnBajar)
                            .addComponent(btnSubir)))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(chkEditar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 158, Short.MAX_VALUE)
                        .addComponent(lblRegresar)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblUsuario)
                    .addComponent(lblNombre))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(lblCategoria)
                .addGap(18, 18, 18)
                .addComponent(lblEscoger)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(cboxServicios, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnEliminarServicio)
                    .addComponent(btnAgregarServicio))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnSubir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btnBajar))
                    .addComponent(pnlListaCampos, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAgregarCampo)
                    .addComponent(btnEliminarCampo))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblRegresar)
                    .addComponent(chkEditar))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void lblRegresarMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblRegresarMouseEntered
        Font f = lblRegresar.getFont();
        f = f.deriveFont(Font.BOLD);
        lblRegresar.setFont(f);
    }//GEN-LAST:event_lblRegresarMouseEntered

    private void lblRegresarMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblRegresarMouseExited
        Font f = lblRegresar.getFont();
        f = f.deriveFont(Font.PLAIN);
        lblRegresar.setFont(f);
    }//GEN-LAST:event_lblRegresarMouseExited

    private void lblRegresarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblRegresarMouseClicked
        // Realizar los cambios del ultimo enlace
        if( enlaceActual != null )
            enlaceActual.realizarCambios();
        
        FramePrincipal.cambiarPanel(panelAnterior);
    }//GEN-LAST:event_lblRegresarMouseClicked

    private void chkEditarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkEditarActionPerformed
        // Habilitar o desabilitar los botones de edicion
        boolean habilitar = chkEditar.isSelected();
        
        // Validar la contraseña
        if( habilitar ){
            PedirContrasena validar = new PedirContrasena(
                    null, true, usuarioActual.obtenerUsuario() );
            validar.setVisible(true);
            
            if( !validar.esContrasenaValida() ){
                chkEditar.setSelected(false);
                return;
            }
        }
        
        btnAgregarCampo.setEnabled(habilitar);
        btnEliminarCampo.setEnabled(habilitar);
        btnSubir.setEnabled(habilitar);
        btnBajar.setEnabled(habilitar);
        
        cambiarCampos();
    }//GEN-LAST:event_chkEditarActionPerformed

    private void btnAgregarServicioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAgregarServicioActionPerformed
        // Pedir el nombre del nuevo servicio
        String nuevoServicio = (String)JOptionPane.showInputDialog(
                this,
                "Ingrese el nombre del nuevo Servicio:",
                "Agregar servicio",
                JOptionPane.PLAIN_MESSAGE,
                null,
                null,
                null );
        
        // Revisar que el servicio no exista
        if( serviciosDisponibles.contains(nuevoServicio) ){
            JOptionPane.showMessageDialog(this, "El Servicio especificado ya existe",
                    "Servicio repetido", JOptionPane.ERROR_MESSAGE );
            return;
        }
        
        // Comprobar si se puede agregar el Servicio
        if( FramePrincipal.obtenerServicios().agregarServicio(nombreCategoria, nuevoServicio) ){
            cboxServicios.addItem( nuevoServicio );
            serviciosDisponibles.add(nuevoServicio);
        } else {
            JOptionPane.showMessageDialog(this, "No se pudo agregar el Servicio",
                    "Servicio inválido", JOptionPane.ERROR_MESSAGE );
        }
    }//GEN-LAST:event_btnAgregarServicioActionPerformed

    private void btnEliminarServicioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarServicioActionPerformed
        // Preguntar el servicio a elminar
        String servicioEliminar = (String)JOptionPane.showInputDialog(
                    this,
                    "Seleccione el Servicio que desea eliminar",
                    "Eliminar Servicio",
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    serviciosDisponibles.toArray(),
                    null);
        
        if( servicioEliminar.isEmpty() )
            return;
        
        // Eliminar el servicio seleccionado
        int opcion = JOptionPane.showConfirmDialog(this,
                "¿Esta seguro de querer eliminar el Servicio " +
                servicioEliminar + " y todos los datos asociados?",
                "Elimnar Servicio", JOptionPane.WARNING_MESSAGE);
        
        if( opcion == JOptionPane.OK_OPTION ){
            // Obtener el enlace al servicio y eliminar todos sus campos
            iEnlace enlace = FramePrincipal.obtenerServicios().enlazar(nombreCategoria, servicioEliminar);
            if( enlace == null )
                return;
            
            for (String nombreCampo : enlace.obtenerNombreCampos())
                enlace.cambiarCampo(nombreCampo, null);
            enlace.realizarCambios();
            
            // Eliminar el Servicio del listado
            serviciosDisponibles.remove(servicioEliminar);
            cboxServicios.removeItem(servicioEliminar);
            enlace.realizarCambios();
        }
    }//GEN-LAST:event_btnEliminarServicioActionPerformed

    private void cboxServiciosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cboxServiciosActionPerformed
        // Vaciar los arreglos de campos
        campos.clear();
        valores.clear();
        seleccionActual = -1;
        
        // Guardar los cambios del enlace anterior
        if( enlaceActual != null )
            enlaceActual.realizarCambios();
        
        // Validar el valor del nuevo Servicio
        String servicioElegido = (String)cboxServicios.getSelectedItem();
        if( servicioElegido == null || servicioElegido.isEmpty() ){
            enlaceActual = null;
            cambiarCampos();
            return;
        }
        
        // Enlazar el Servicio y obtener sus campos
        enlaceActual = FramePrincipal.obtenerServicios().enlazar(nombreCategoria,
                servicioElegido);
        if( enlaceActual == null ){
            JOptionPane.showMessageDialog(this, 
                    "No se pudo enlazar el Servicio " + servicioElegido,
                    "Servicio invalido", JOptionPane.ERROR_MESSAGE);
            cambiarCampos();
            return;
        }
        
        for (String nombreCampo : enlaceActual.obtenerNombreCampos()) {
            campos.add(nombreCampo);
            valores.add(enlaceActual.obtenerCampo(nombreCampo));
        }
        
        cambiarCampos();
        return;
    }//GEN-LAST:event_cboxServiciosActionPerformed

    private void btnAgregarCampoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAgregarCampoActionPerformed
        // Validar
        if( enlaceActual == null ){
            JOptionPane.showMessageDialog(this, "No se ha seleccionado un Servicio",
                    "Servicio no seleccionado", JOptionPane.ERROR_MESSAGE);
            return;
        }
        
        // Pedir el nuevo campo
        String nuevoCampo = (String)JOptionPane.showInputDialog(
                    this,
                    "Ingrese el nombre del nuevo campo",
                    "Nuevo campo",
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    null,
                    null);
        if( nuevoCampo == null || nuevoCampo.isEmpty() )
            return;
        
        if( campos.contains(nuevoCampo) ){
            JOptionPane.showMessageDialog(this, "El campo especificado ya existe",
                    "Campo repetido", JOptionPane.ERROR_MESSAGE);
            return;
        }
        
        // Agregar el nuevo campo
        enlaceActual.agregarCampo(nuevoCampo, -1);
        campos.add(nuevoCampo);
        valores.add("");
        cambiarCampos();
    }//GEN-LAST:event_btnAgregarCampoActionPerformed

    private void btnSubirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSubirActionPerformed
        // Subir una posicion la cardinalidad
        if( enlaceActual == null || seleccionActual == -1 || seleccionActual == 0)
            return;
        
        enlaceActual.cambiarCardinalidadCampo( campos.get(seleccionActual),
                seleccionActual-1 );
        
        // Refrescar los listados de campos y valores
        String campo = campos.remove(seleccionActual);
        campos.add(seleccionActual-1, campo);
        
        String valor = valores.remove(seleccionActual);
        valores.add(seleccionActual-1, valor);
        seleccionActual -= 1;
        enlaceActual.realizarCambios();
        
        cambiarCampos();
    }//GEN-LAST:event_btnSubirActionPerformed

    private void btnBajarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBajarActionPerformed
        // Bajar la posicion de cardinalidad
        if( enlaceActual == null || seleccionActual == -1 || 
                seleccionActual == campos.size()-1 )
            return;
        
        enlaceActual.cambiarCardinalidadCampo( campos.get(seleccionActual),
                seleccionActual+1 );
        
        // Refrescar los listados de campos y valores
        String campo = campos.remove(seleccionActual);
        campos.add(seleccionActual+1, campo);
        
        String valor = valores.remove(seleccionActual);
        valores.add(seleccionActual+1, valor);
        seleccionActual += 1;
        enlaceActual.realizarCambios();
        
        cambiarCampos();
    }//GEN-LAST:event_btnBajarActionPerformed

    private void btnEliminarCampoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarCampoActionPerformed
        // Eliminar el campo seleccionado
        if( enlaceActual == null || seleccionActual == -1 )
            return;
        
        // Eliminar el campo
        enlaceActual.cambiarCampo(campos.get(seleccionActual), null);
        campos.remove(seleccionActual);
        valores.remove(seleccionActual);
        enlaceActual.realizarCambios();
        
        cambiarCampos();
    }//GEN-LAST:event_btnEliminarCampoActionPerformed

    /**
     * Realiza los cambios necesarios para mostrar los campos de un Servicio
     */
    private void cambiarCampos(){
        // Borrar todos los campos anteriores
        pnlCampos.removeAll();
        
        // Revisar el enlace
        if( enlaceActual == null ){
            chkEditar.setEnabled(false);
            pnlListaCampos.setViewportView(pnlRelleno);
            return;
        } else {
            chkEditar.setEnabled(true);
        }
        
        // Revisar si son datos editables o no
        if( chkEditar.isSelected() ){
            // DATOS EDITABLES
            pnlCampos.setLayout( new GridBagLayout() );
            ButtonGroup group = new ButtonGroup();
            
            for (int lineaActual = -1; lineaActual < campos.size(); lineaActual++) {
                GridBagConstraints c = new GridBagConstraints();
                c.anchor = GridBagConstraints.FIRST_LINE_START;
                c.gridy = lineaActual+1;
                
                if( lineaActual == -1 ){
                    // Agregar los letreros de columna
                    c.weightx = 0.50;
                    c.gridx = 0;
                    JLabel campo = new JLabel( "CAMPO" );
                    Font f = campo.getFont();
                    f = f.deriveFont( Font.BOLD );
                    campo.setFont(f);
                    pnlCampos.add(campo,c);

                    c.gridx = 1;
                    JLabel valor = new JLabel( "VALOR" );
                    valor.setFont(f);
                    pnlCampos.add(valor,c);
                } else {
                    // Agregar los valores
                    // Seleccion
                    c.gridx = 0;
                    c.weightx = 0.50;
                    JRadioButton seleccion = new JRadioButton( campos.get(lineaActual) );
                    seleccion.setActionCommand(Integer.toString(lineaActual));
                    seleccion.addActionListener( new SeleccionCampo() );
                    pnlCampos.add(seleccion, c);
                    group.add(seleccion);
                    
                    if( lineaActual == seleccionActual )
                        group.setSelected( seleccion.getModel(), true );
                    
                    // Valor campo
                    c.gridx = 1;
                    c.gridy = lineaActual+1;
                    c.weightx = 0.50;
                    c.fill = GridBagConstraints.HORIZONTAL;
                    JTextField valorCampo = new JTextField(valores.get(lineaActual));
                    valorCampo.addKeyListener( new CambioCampo( campos.get(lineaActual) ) );
                    pnlCampos.add(valorCampo, c);
                }
                
            }
            
        } else {
            // DATOS NO EDITABLES
            pnlCampos.setLayout( new GridBagLayout() );
            
            for (int i = -1; i < campos.size(); i++) {
                // Poner las restricciones
                GridBagConstraints c = new GridBagConstraints();
                //c.anchor = GridBagConstraints.FIRST_LINE_START;
                c.gridy = i+1;
                c.fill = GridBagConstraints.HORIZONTAL;
                c.weightx = 0.5;
                c.anchor = GridBagConstraints.CENTER;
                
                // Poner el label del campo
                c.gridx = 0;
                JLabel lblCampo = new JLabel();
                Font f = lblCampo.getFont();
                f = f.deriveFont( Font.BOLD );
                
                if( i == -1 ){
                    lblCampo.setText("CAMPO");
                    lblCampo.setFont(f);
                }
                else
                    lblCampo.setText(campos.get(i));
                pnlCampos.add(lblCampo, c);
                
                // Poner el label del valor
                c.gridx = 1;
                if( i == -1 ){
                    JLabel lblValor = new JLabel();
                    lblValor.setText("VALOR");
                    lblValor.setFont(f);
                    pnlCampos.add(lblValor, c);
                }else{
                    // Obtener los datos de la linea
                    final String nombreCampo;
                    final String valorCampo = valores.get(i);

                    /* Verificar si el campo es protegido */
                    boolean campoProtegido = false;
                    {
                        String campo = campos.get(i);
                        campo = campo.trim();
                        if( campo.startsWith("*") ){
                            campoProtegido = true;
                            nombreCampo = campo.substring( 1 );
                            lblCampo.setText(nombreCampo);
                        } else 
                            nombreCampo = campo;
                    }
                    
                    // Crear los componentes del campo y valor
                    if( campoProtegido ){
                        // Usar boton de confirmacion
                        JButton mostrarValor = new JButton( "Mostrar" );
                        
                        /* Puesto que el nombre del campo se modifica para
                         * mostrarse es necesario ubicar el verdadero nombre
                         * del mismo para buscarlo.
                         */
                        final String verdaderoCampo = campos.get(i);
                        
                        
                        mostrarValor.addActionListener( new ActionListener() {
                            @Override
                            public void actionPerformed(ActionEvent ae) {
                                PedirContrasena validar = new PedirContrasena(null,
                                        true, usuarioActual.obtenerUsuario());
                                validar.setVisible(true);
                                
                                if( validar.esContrasenaValida() ){
                                    String valor = enlaceActual.obtenerCampo(verdaderoCampo);
                                    JOptionPane.showMessageDialog(null, valor, 
                                            "Mostrando: " + nombreCampo,
                                            JOptionPane.INFORMATION_MESSAGE);
                                }
                            }
                        });
                        pnlCampos.add(mostrarValor, c);
                    }else{
                        JLabel lblValor = new JLabel();
                        lblValor.setText(valorCampo);
                        pnlCampos.add(lblValor, c);
                    }
                }
            }
        }
        
        pnlListaCampos.setViewportView(pnlRelleno);
    }
    
    private class SeleccionCampo implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent ae) {
            seleccionActual = Integer.parseInt( ae.getActionCommand() );
        }
    }
    
    private class CambioCampo extends KeyAdapter{
        private final String nombreCampo;

        public CambioCampo(String nombreCampo) {
            this.nombreCampo = nombreCampo;
        }
        
        @Override
        public void keyTyped(KeyEvent ke) {
            super.keyTyped(ke);
            
            JTextField campo = (JTextField)ke.getSource();
            String valorCampo = campo.getText() + ke.getKeyChar();
            
            if( enlaceActual != null ){
                enlaceActual.cambiarCampo(nombreCampo, valorCampo );
                int indice = campos.indexOf(nombreCampo);
                valores.set(indice, valorCampo);
            }
        }
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAgregarCampo;
    private javax.swing.JButton btnAgregarServicio;
    private javax.swing.JButton btnBajar;
    private javax.swing.JButton btnEliminarCampo;
    private javax.swing.JButton btnEliminarServicio;
    private javax.swing.JButton btnSubir;
    private javax.swing.JComboBox cboxServicios;
    private javax.swing.JCheckBox chkEditar;
    private javax.swing.JLabel lblCategoria;
    private javax.swing.JLabel lblEscoger;
    private javax.swing.JLabel lblNombre;
    private javax.swing.JLabel lblRegresar;
    private javax.swing.JLabel lblUsuario;
    private javax.swing.JScrollPane pnlListaCampos;
    // End of variables declaration//GEN-END:variables
}
